using System;
using System.Collections.Generic;
using System.Text;

namespace tp1.Entidades
{
    class Punto
    {
        private double x = 0;
        private double y = 0;

        public Punto()
        {
        }

        public Punto(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

        #region Propiedades
        public double X
        {
            set { x = value; }
            get { return x; }
        }

        public double Y
        {
            set { y = value; }
            get { return y; }
        }

        public int Xint
        {
            get { return (int)Math.Round(x, MidpointRounding.AwayFromZero); }
        }

        public int Yint
        {
            get { return (int)Math.Round(y, MidpointRounding.AwayFromZero); }
        }
        #endregion

        #region Operadores
        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;

            Punto p = obj as Punto;
            if ((object)p == null)
                return false;

            return (x == p.x) && (y == p.y);
        }

        public static bool operator ==(Punto a, Punto b)
        {
            if (System.Object.ReferenceEquals(a, b))
            {
                return true;
            }

            if (((object)a == null) || ((object)b == null))
            {
                return false;
            }

            return a.x == b.x && a.y == b.y;
        }

        public static bool operator !=(Punto a, Punto b)
        {
            return !(a == b);
        }

        public static Punto operator *(Matriz matriz, Punto punto)
        {
            double x = matriz[0, 0] * punto.X + matriz[0, 1] * punto.Y + matriz[0, 2];
            double y = matriz[1, 0] * punto.X + matriz[1, 1] * punto.Y + matriz[1, 2];
            return new Punto(x, y);
        }

        public override int GetHashCode()
        {
            return Xint ^ Yint;
        }
        #endregion
    }
}
